drop table jms_dwd.dwd_s03_barscan_operations_hist_dt;
CREATE EXTERNAL TABLE jms_dwd.dwd_s03_barscan_operations_hist_dt(
  `scan_type` string COMMENT '扫描类型',
  `billcode` string COMMENT '运单号',
  `network_code` string COMMENT '网点编码',
  `network_type` string COMMENT '网点类型',
  `scan_time` string COMMENT '扫描时间',
  `recordid` string COMMENT '记录编号',
  `packagecode` string COMMENT '所属袋号',
  `nextstationcode` string COMMENT '上下一站编号',
  `nextstation` string COMMENT '上一站或下一站',
  `destination` string COMMENT '目的地点',
  `scanusercode` string COMMENT '扫描雇员编号',
  `scanuser` string COMMENT '扫描雇员',
  `source` string COMMENT '来源',
  `weight` string COMMENT '重量',
  `expresstype` string COMMENT '快件类型',
  `returnflag` string COMMENT '退件标识',
  `elescaleflag` string COMMENT '电子秤标识',
  `pistolid` string COMMENT '巴枪ID',
  `transfercode` string COMMENT '转单号',
  `is_sign` smallint COMMENT '签收标识,1是，0否',
  `input_time` timestamp COMMENT '运单录入时间',
  `operation_dt` string COMMENT '操作日期',
  `sendcustomer` string COMMENT '寄件客户',
  `subbillcode` string COMMENT '子单号')
COMMENT '运单操作汇总表,记录运单所有操作,时间范围30天，粒度：运单+操作'
PARTITIONED BY (
  `dt` string COMMENT '运单录入时间，yyyy-MM-dd')
STORED AS parquet
LOCATION
  '/dw/hive/jms_dwd.db/external/dwd_s03_barscan_operations_hist_dt' ;
msck repair table jms_dwd.dwd_s03_barscan_operations_hist_dt;


--目标表： dwd_s03_barscan_operations_hist_dt
--该表设计目标： 获取扫描表基础数据做明细模型的基表，以运单在运单表中的录入时间为分区Dt，将运单历史的和最新的所有扫描操作，以追加的方式添加到Dt分区中
--注意事项：
--1 支持回刷，通过operation_dt 字段保证，每次重跑之前，先通过operation_dt字段，过滤上次写入的数据

--2 基表涉及到的操作表和运单表如下
--tab_barscan_taking         揽收表
--tab_barscan_warehousing    入仓表
--tab_barscan_sitesend       网点发件表
--tab_barscan_sitearrival    网点到件表
--tab_barscan_unloading      卸车表
--tab_barscan_bagging        建包表
--tab_barscan_centersend     中心发件表
--tab_barscan_centerarrival  中心到件表
--tab_barscan_loading        装车表
--tab_barscan_deliver        派件表
--tab_barscan_sign           签收表
--tab_barscan_collect        代收(入库，出库，快件取出，代理点收入)
--tab_barscan_other          其它(封发车，到解车，拆包，留仓件入仓)

--jms_dwd.dwd_yl_oms_oms_waybill_incre_dt  运单去重记录表,每个分区保留的是当日新增数据，保证60天内运单数据最新

--3 操作表数据，通过运单号关联运单表，获取运单的录入时间作为分区字段

--4 每天取 T-1天操作表操作数据 关联（T-1 ~ T-30）近30天的运单表，获取操作数据对应运单的录入时间，ps： 运单产生后，允许30天内的操作数据都会追加到目标表中
--5 4中 T-1 天操作数据，以运单号关联近30天运单表，存在关联不上的情况，情况有二，
--   第一： 操作数据对应的运单在30天以前产生，所以关联不上
--   第二： 操作数据对应的运单 当时没有被维护到运单表里面去，可以理解为 操作数据的扫描时间比运单的录入时间要早，这批单什么时候维护到运单表中去，是个问题，可能超过30天都不会别维护到运单表中
--6 对于5中关联不上的运单，我们 通过cast(nvl(t2.input_time,'2049-12-31 23:59:59') as timestamp) as input_time  给它一个默认的运单录入时间，用于后续计算，保证程序不丢数，这部分数据统一进入日期2049分区中
--7 这里通过union all动态分区覆盖的方式，实现操作数据的追加

alter table jms_dwd.dwd_s03_barscan_operations_hist_dt add columns (
    roadsection_id         bigint    comment'路段编号'
    ,planned_arrival_time   timestamp comment'规划到达时间'
    ,actual_arrival_time    timestamp comment'实际到达时间'
    ,planned_departure_time timestamp comment'规划离开时间'
    ,actual_departure_time  timestamp comment'实际离开时间'
    ,latest_arrival_time    timestamp comment'最后到达时间'
    ,table_type             int       comment'支干线类型'
    ,vehicleline_code       string    comment'线路编码'
    ,vehicleline_name       string    comment'线路名称'
    ,shipment_name          string    comment'任务号名称'
    ,is_transfer            int       comment'是否中转 1是 0否'
)cascade;